package com.example.JPetStore.controller;

import com.example.JPetStore.Common;
import com.example.JPetStore.dao.UserDao;
import com.example.JPetStore.domain.User;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.Random;

@RequestMapping("/account")
@Controller
public class AccountController {

    @Autowired
    UserDao userDao;
    @SneakyThrows
    @GetMapping("/CodeController")
    @ResponseBody
    public ModelAndView code(HttpServletRequest request, HttpServletResponse response){
        HttpSession session = request.getSession();
        //   取随机产生的认证码(4位数字)
        String   sRand= UserDao.getRandCode();
//        String   sRand= "1234";


//   将认证码存入SESSION
        session.setAttribute("code",sRand);

        //设置页面不缓存
        response.setHeader("Pragma","No-cache");
        response.setHeader("Cache-Control","no-cache");
        response.setDateHeader("Expires",   0);

//   在内存中创建图象
        int   width=60,   height=20;
        BufferedImage image   =   new   BufferedImage(width,   height,   BufferedImage.TYPE_INT_RGB);

//   获取图形上下文
        Graphics   g   =   image.getGraphics();

//生成随机类
        Random   random   =   new   Random();

//   设定背景色
        g.setColor(getRandColor(200,250));
        g.fillRect(0,   0,   width,   height);

//设定字体
        g.setFont(new   Font("Comic   Sans   MS",Font.PLAIN,20));

//画边框
//g.setColor(new   Color());
//g.drawRect(0,0,width-1,height-1);


//   随机产生155条干扰线，使图象中的认证码不易被其它程序探测到
        g.setColor(getRandColor(160,200));
        for   (int   i=0;i<155;i++)
        {
            int   x   =   random.nextInt(width);
            int   y   =   random.nextInt(height);
            int   xl   =   random.nextInt(12);
            int   yl   =   random.nextInt(12);
            g.drawLine(x,y,x+xl,y+yl);
        }

        for   (int   i=0;i<4;i++){
            String   rand=sRand.charAt(i)+"";
            //   将认证码显示到图象中
            g.setColor(new   Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
//调用函数出来的颜色相同，可能是因为种子太接近，所以只能直接生成
            g.drawString(rand,13*i+6,16);
        }


//   图象生效
        g.dispose();

//   输出图象到页面
        ImageIO.write(image,   "JPEG",   response.getOutputStream());

        return null;
    }

    @PostMapping("/EditInfoActionController")
    public ModelAndView editInfoAction(HttpSession session, @RequestParam("nick_name")String nickName){
        ModelAndView mv=new ModelAndView();

        User user= Common.checkLogin(mv,session);
        if(user==null)return mv;


        userDao.editInfo(user.getUserId(),nickName);
        user=userDao.queryUser1(nickName);
        session.setAttribute("user",user);

        Common.sendErrorMessage(mv, "修改成功！", "/account/SelfController");

        return mv;
    }

    @GetMapping("/EditInfoController")
    public ModelAndView editInfo(HttpSession session) {
        ModelAndView mv = new ModelAndView();
        User user= Common.checkLogin(mv,session);
        if(user==null)return mv;

        mv.setViewName("/account/editinfo");
        return mv;
    }

    @PostMapping("/EditPasswordActionController")
    public ModelAndView EditPasswordAction(HttpSession session,@RequestParam("old_password")String oldPassword,@RequestParam("new_password")String newPassword) {
        ModelAndView mv = new ModelAndView();

        User user= Common.checkLogin(mv,session);
        if(user==null)return mv;

        if(!oldPassword.equals(user.getPassword())){
            Common.sendErrorMessage(mv, "密码错误！", "/account/EditInfoController");
            return mv;
        }

        userDao.editPassword(user.getUserId(),newPassword);

        //更新数据
        user=userDao.queryUser(user.getUserId());
        session.setAttribute("user",user);

        Common.sendErrorMessage(mv, "修改成功！", "/account/SelfController");
        return mv;
    }

    @PostMapping("/LoginController")
    public ModelAndView Login(HttpSession session,@RequestParam("nick_name")String nickName,@RequestParam("password")String password,@RequestParam("code")String code) {
        ModelAndView mv = new ModelAndView();

        String sessionCode=(String)session.getAttribute("code");

        System.out.println(nickName);

        //   取随机产生的认证码(4位数字)
        String   sRand= userDao.getRandCode();
//    String   sRand= "1234";
//   将认证码存入SESSION
        session.setAttribute("code",sRand);


        if(!code.equals(sessionCode)){
            Common.sendErrorMessage(mv, "验证码错误！", "/account/login.html");
            return mv;
        }

        User user=userDao.queryUser1(nickName);
        if(user==null){
            Common.sendErrorMessage(mv, "用户不存在！", "/account/login.html");
            return mv;
        }
        System.out.println(user.getPassword());
        System.out.println(password);
        System.out.println(Common.md5(password));
        if(!user.getPassword().equals(Common.md5(password))){
            Common.sendErrorMessage(mv, "密码错误！", "/account/login.html");
            return mv;
        }
        session.setAttribute("user",user);
        Common.sendErrorMessage(mv, "登陆成功！", "/catalog/MainController");
        return mv;
    }

    @PostMapping("/LoginoutController")
    public ModelAndView loginout(HttpSession session){
        ModelAndView mv = new ModelAndView();
        session.removeAttribute("user");
        mv.setViewName("redirect:/account/login.html");
        return mv;
    }

    @GetMapping("/RegisterController")
    public ModelAndView register(HttpSession session,@RequestParam("nick_name")String nickName,@RequestParam("password")String password,@RequestParam("code") String code){
        ModelAndView mv = new ModelAndView();

        String sessionCode=(String)session.getAttribute("code");

        //   取随机产生的认证码(4位数字)
        String   sRand= userDao.getRandCode();
//    String   sRand= "1234";
//   将认证码存入SESSION
        session.setAttribute("code",sRand);


//    System.out.println(nickName);

        if(!code.equals(sessionCode)){
            Common.sendErrorMessage(mv, "验证码错误！", "/account/register.html");
            return mv;
        }
        User user=new User();
        user.setNickName(nickName);
        user.setPassword(password);
        user=userDao.registerUser(user);

        Common.sendErrorMessage(mv, "注册成功！欢迎你："+user.getNickName(), "/account/login.html");
        return mv;
    }

    @GetMapping("/SelfController")
    public ModelAndView self(HttpSession session){
        ModelAndView mv = new ModelAndView();
        User user= Common.checkLogin(mv,session);
        if(user==null)return mv;
        mv.setViewName("/account/self");
        return mv;
    }


    static Color getRandColor(int   fc, int   bc){ //给定范围获得随机颜色
        Random random   =   new   Random();
        if(fc>255)   fc=255;
        if(bc>255)   bc=255;
        int   r=fc+random.nextInt(bc-fc);
        int   g=fc+random.nextInt(bc-fc);
        int   b=fc+random.nextInt(bc-fc);
        return   new   Color(r,g,b);
    }
}
